package redis.clients.jedis;

import java.util.List;
import java.util.Map;
import java.util.Set;

public abstract class MultiKeyPipelineBase extends PipelineBase implements
		MultiKeyBinaryRedisPipeline, MultiKeyCommandsPipeline, ClusterPipeline,
		BinaryScriptingCommandsPipeline, ScriptingCommandsPipeline {

	protected Client client = null;

	public Response<List<String>> brpop(String... args) {
		client.brpop(args);
		return getResponse(BuilderFactory.STRING_LIST);
	}

	public Response<List<String>> brpop(int timeout, String... keys) {
		client.brpop(timeout, keys);
		return getResponse(BuilderFactory.STRING_LIST);
	}

	public Response<List<String>> blpop(String... args) {
		client.blpop(args);
		return getResponse(BuilderFactory.STRING_LIST);
	}

	public Response<List<String>> blpop(int timeout, String... keys) {
		client.blpop(timeout, keys);
		return getResponse(BuilderFactory.STRING_LIST);
	}

	public Response<Map<String, String>> blpopMap(int timeout, String... keys) {
		client.blpop(timeout, keys);
		return getResponse(BuilderFactory.STRING_MAP);
	}

	public Response<List<byte[]>> brpop(byte[]... args) {
		client.brpop(args);
		return getResponse(BuilderFactory.BYTE_ARRAY_LIST);
	}

	public Response<List<String>> brpop(int timeout, byte[]... keys) {
		client.brpop(timeout, keys);
		return getResponse(BuilderFactory.STRING_LIST);
	}

	public Response<Map<String, String>> brpopMap(int timeout, String... keys) {
		client.blpop(timeout, keys);
		return getResponse(BuilderFactory.STRING_MAP);
	}

	public Response<List<byte[]>> blpop(byte[]... args) {
		client.blpop(args);
		return getResponse(BuilderFactory.BYTE_ARRAY_LIST);
	}

	public Response<List<String>> blpop(int timeout, byte[]... keys) {
		client.blpop(timeout, keys);
		return getResponse(BuilderFactory.STRING_LIST);
	}

	public Response<Long> del(String... keys) {
		client.del(keys);
		return getResponse(BuilderFactory.LONG);
	}

	public Response<Long> del(byte[]... keys) {
		client.del(keys);
		return getResponse(BuilderFactory.LONG);
	}

	public Response<Set<String>> keys(String pattern) {
		getClient(pattern).keys(pattern);
		return getResponse(BuilderFactory.STRING_SET);
	}

	public Response<Set<byte[]>> keys(byte[] pattern) {
		getClient(pattern).keys(pattern);
		return getResponse(BuilderFactory.BYTE_ARRAY_ZSET);
	}

	public Response<List<String>> mget(String... keys) {
		client.mget(keys);
		return getResponse(BuilderFactory.STRING_LIST);
	}

	public Response<List<byte[]>> mget(byte[]... keys) {
		client.mget(keys);
		return getResponse(BuilderFactory.BYTE_ARRAY_LIST);
	}

	public Response<String> mset(String... keysvalues) {
		client.mset(keysvalues);
		return getResponse(BuilderFactory.STRING);
	}

	public Response<String> mset(byte[]... keysvalues) {
		client.mset(keysvalues);
		return getResponse(BuilderFactory.STRING);
	}

	public Response<Long> msetnx(String... keysvalues) {
		client.msetnx(keysvalues);
		return getResponse(BuilderFactory.LONG);
	}

	public Response<Long> msetnx(byte[]... keysvalues) {
		client.msetnx(keysvalues);
		return getResponse(BuilderFactory.LONG);
	}

	public Response<String> rename(String oldkey, String newkey) {
		client.rename(oldkey, newkey);
		return getResponse(BuilderFactory.STRING);
	}

	public Response<String> rename(byte[] oldkey, byte[] newkey) {
		client.rename(oldkey, newkey);
		return getResponse(BuilderFactory.STRING);
	}

	public Response<Long> renamenx(String oldkey, String newkey) {
		client.renamenx(oldkey, newkey);
		return getResponse(BuilderFactory.LONG);
	}

	public Response<Long> renamenx(byte[] oldkey, byte[] newkey) {
		client.renamenx(oldkey, newkey);
		return getResponse(BuilderFactory.LONG);
	}

	public Response<String> rpoplpush(String srckey, String dstkey) {
		client.rpoplpush(srckey, dstkey);
		return getResponse(BuilderFactory.STRING);
	}

	public Response<byte[]> rpoplpush(byte[] srckey, byte[] dstkey) {
		client.rpoplpush(srckey, dstkey);
		return getResponse(BuilderFactory.BYTE_ARRAY);
	}

	public Response<Set<String>> sdiff(String... keys) {
		client.sdiff(keys);
		return getResponse(BuilderFactory.STRING_SET);
	}

	public Response<Set<byte[]>> sdiff(byte[]... keys) {
		client.sdiff(keys);
		return getResponse(BuilderFactory.BYTE_ARRAY_ZSET);
	}

	public Response<Long> sdiffstore(String dstkey, String... keys) {
		client.sdiffstore(dstkey, keys);
		return getResponse(BuilderFactory.LONG);
	}

	public Response<Long> sdiffstore(byte[] dstkey, byte[]... keys) {
		client.sdiffstore(dstkey, keys);
		return getResponse(BuilderFactory.LONG);
	}

	public Response<Set<String>> sinter(String... keys) {
		client.sinter(keys);
		return getResponse(BuilderFactory.STRING_SET);
	}

	public Response<Set<byte[]>> sinter(byte[]... keys) {
		client.sinter(keys);
		return getResponse(BuilderFactory.BYTE_ARRAY_ZSET);
	}

	public Response<Long> sinterstore(String dstkey, String... keys) {
		client.sinterstore(dstkey, keys);
		return getResponse(BuilderFactory.LONG);
	}

	public Response<Long> sinterstore(byte[] dstkey, byte[]... keys) {
		client.sinterstore(dstkey, keys);
		return getResponse(BuilderFactory.LONG);
	}

	public Response<Long> smove(String srckey, String dstkey, String member) {
		client.smove(srckey, dstkey, member);
		return getResponse(BuilderFactory.LONG);
	}

	public Response<Long> smove(byte[] srckey, byte[] dstkey, byte[] member) {
		client.smove(srckey, dstkey, member);
		return getResponse(BuilderFactory.LONG);
	}

	public Response<Long> sort(String key, SortingParams sortingParameters,
			String dstkey) {
		client.sort(key, sortingParameters, dstkey);
		return getResponse(BuilderFactory.LONG);
	}

	public Response<Long> sort(byte[] key, SortingParams sortingParameters,
			byte[] dstkey) {
		client.sort(key, sortingParameters, dstkey);
		return getResponse(BuilderFactory.LONG);
	}

	public Response<Long> sort(String key, String dstkey) {
		client.sort(key, dstkey);
		return getResponse(BuilderFactory.LONG);
	}

	public Response<Long> sort(byte[] key, byte[] dstkey) {
		client.sort(key, dstkey);
		return getResponse(BuilderFactory.LONG);
	}

	public Response<Set<String>> sunion(String... keys) {
		client.sunion(keys);
		return getResponse(BuilderFactory.STRING_SET);
	}

	public Response<Set<byte[]>> sunion(byte[]... keys) {
		client.sunion(keys);
		return getResponse(BuilderFactory.BYTE_ARRAY_ZSET);
	}

	public Response<Long> sunionstore(String dstkey, String... keys) {
		client.sunionstore(dstkey, keys);
		return getResponse(BuilderFactory.LONG);
	}

	public Response<Long> sunionstore(byte[] dstkey, byte[]... keys) {
		client.sunionstore(dstkey, keys);
		return getResponse(BuilderFactory.LONG);
	}

	public Response<String> watch(String... keys) {
		client.watch(keys);
		return getResponse(BuilderFactory.STRING);
	}

	public Response<String> watch(byte[]... keys) {
		client.watch(keys);
		return getResponse(BuilderFactory.STRING);
	}

	public Response<Long> zinterstore(String dstkey, String... sets) {
		client.zinterstore(dstkey, sets);
		return getResponse(BuilderFactory.LONG);
	}

	public Response<Long> zinterstore(byte[] dstkey, byte[]... sets) {
		client.zinterstore(dstkey, sets);
		return getResponse(BuilderFactory.LONG);
	}

	public Response<Long> zinterstore(String dstkey, ZParams params,
			String... sets) {
		client.zinterstore(dstkey, params, sets);
		return getResponse(BuilderFactory.LONG);
	}

	public Response<Long> zinterstore(byte[] dstkey, ZParams params,
			byte[]... sets) {
		client.zinterstore(dstkey, params, sets);
		return getResponse(BuilderFactory.LONG);
	}

	public Response<Long> zunionstore(String dstkey, String... sets) {
		client.zunionstore(dstkey, sets);
		return getResponse(BuilderFactory.LONG);
	}

	public Response<Long> zunionstore(byte[] dstkey, byte[]... sets) {
		client.zunionstore(dstkey, sets);
		return getResponse(BuilderFactory.LONG);
	}

	public Response<Long> zunionstore(String dstkey, ZParams params,
			String... sets) {
		client.zunionstore(dstkey, params, sets);
		return getResponse(BuilderFactory.LONG);
	}

	public Response<Long> zunionstore(byte[] dstkey, ZParams params,
			byte[]... sets) {
		client.zunionstore(dstkey, params, sets);
		return getResponse(BuilderFactory.LONG);
	}

	public Response<String> bgrewriteaof() {
		client.bgrewriteaof();
		return getResponse(BuilderFactory.STRING);
	}

	public Response<String> bgsave() {
		client.bgsave();
		return getResponse(BuilderFactory.STRING);
	}

	public Response<List<String>> configGet(String pattern) {
		client.configGet(pattern);
		return getResponse(BuilderFactory.STRING_LIST);
	}

	public Response<String> configSet(String parameter, String value) {
		client.configSet(parameter, value);
		return getResponse(BuilderFactory.STRING);
	}

	public Response<String> brpoplpush(String source, String destination,
			int timeout) {
		client.brpoplpush(source, destination, timeout);
		return getResponse(BuilderFactory.STRING);
	}

	public Response<byte[]> brpoplpush(byte[] source, byte[] destination,
			int timeout) {
		client.brpoplpush(source, destination, timeout);
		return getResponse(BuilderFactory.BYTE_ARRAY);
	}

	public Response<String> configResetStat() {
		client.configResetStat();
		return getResponse(BuilderFactory.STRING);
	}

	public Response<String> save() {
		client.save();
		return getResponse(BuilderFactory.STRING);
	}

	public Response<Long> lastsave() {
		client.lastsave();
		return getResponse(BuilderFactory.LONG);
	}

	public Response<Long> publish(String channel, String message) {
		client.publish(channel, message);
		return getResponse(BuilderFactory.LONG);
	}

	public Response<Long> publish(byte[] channel, byte[] message) {
		client.publish(channel, message);
		return getResponse(BuilderFactory.LONG);
	}

	public Response<String> randomKey() {
		client.randomKey();
		return getResponse(BuilderFactory.STRING);
	}

	public Response<byte[]> randomKeyBinary() {
		client.randomKey();
		return getResponse(BuilderFactory.BYTE_ARRAY);
	}

	public Response<String> flushDB() {
		client.flushDB();
		return getResponse(BuilderFactory.STRING);
	}

	public Response<String> flushAll() {
		client.flushAll();
		return getResponse(BuilderFactory.STRING);
	}

	public Response<String> info() {
		client.info();
		return getResponse(BuilderFactory.STRING);
	}

	public Response<String> info(final String section) {
		client.info(section);
		return getResponse(BuilderFactory.STRING);
	}

	public Response<Long> dbSize() {
		client.dbSize();
		return getResponse(BuilderFactory.LONG);
	}

	public Response<String> shutdown() {
		client.shutdown();
		return getResponse(BuilderFactory.STRING);
	}

	public Response<String> ping() {
		client.ping();
		return getResponse(BuilderFactory.STRING);
	}

	public Response<String> select(int index) {
		client.select(index);
		Response<String> response = getResponse(BuilderFactory.STRING);
		client.setDb(index);

		return response;
	}

	public Response<Long> bitop(BitOP op, byte[] destKey, byte[]... srcKeys) {
		client.bitop(op, destKey, srcKeys);
		return getResponse(BuilderFactory.LONG);
	}

	public Response<Long> bitop(BitOP op, String destKey, String... srcKeys) {
		client.bitop(op, destKey, srcKeys);
		return getResponse(BuilderFactory.LONG);
	}

	public Response<String> clusterNodes() {
		client.clusterNodes();
		return getResponse(BuilderFactory.STRING);
	}

	public Response<String> clusterMeet(final String ip, final int port) {
		client.clusterMeet(ip, port);
		return getResponse(BuilderFactory.STRING);
	}

	public Response<String> clusterAddSlots(final int... slots) {
		client.clusterAddSlots(slots);
		return getResponse(BuilderFactory.STRING);
	}

	public Response<String> clusterDelSlots(final int... slots) {
		client.clusterDelSlots(slots);
		return getResponse(BuilderFactory.STRING);
	}

	public Response<String> clusterInfo() {
		client.clusterInfo();
		return getResponse(BuilderFactory.STRING);
	}

	public Response<List<String>> clusterGetKeysInSlot(final int slot,
			final int count) {
		client.clusterGetKeysInSlot(slot, count);
		return getResponse(BuilderFactory.STRING_LIST);
	}

	public Response<String> clusterSetSlotNode(final int slot,
			final String nodeId) {
		client.clusterSetSlotNode(slot, nodeId);
		return getResponse(BuilderFactory.STRING);
	}

	public Response<String> clusterSetSlotMigrating(final int slot,
			final String nodeId) {
		client.clusterSetSlotMigrating(slot, nodeId);
		return getResponse(BuilderFactory.STRING);
	}

	public Response<String> clusterSetSlotImporting(final int slot,
			final String nodeId) {
		client.clusterSetSlotImporting(slot, nodeId);
		return getResponse(BuilderFactory.STRING);
	}

	public Response<Object> eval(String script) {
		return this.eval(script, 0, new String[0]);
	}

	public Response<Object> eval(String script, List<String> keys,
			List<String> args) {
		String[] argv = Jedis.getParams(keys, args);
		return this.eval(script, keys.size(), argv);
	}

	public Response<Object> eval(String script, int keyCount, String... params) {
		getClient(script).eval(script, keyCount, params);
		return getResponse(BuilderFactory.EVAL_RESULT);
	}

	public Response<Object> evalsha(String script) {
		return this.evalsha(script, 0, new String[0]);
	}

	public Response<Object> evalsha(String sha1, List<String> keys,
			List<String> args) {
		String[] argv = Jedis.getParams(keys, args);
		return this.evalsha(sha1, keys.size(), argv);
	}

	public Response<Object> evalsha(String sha1, int keyCount, String... params) {
		getClient(sha1).evalsha(sha1, keyCount, params);
		return getResponse(BuilderFactory.EVAL_RESULT);
	}

	public Response<Object> eval(byte[] script) {
		return this.eval(script, 0);
	}

	public Response<Object> eval(byte[] script, byte[] keyCount,
			byte[]... params) {
		getClient(script).eval(script, keyCount, params);
		return getResponse(BuilderFactory.EVAL_BINARY_RESULT);
	}

	public Response<Object> eval(byte[] script, List<byte[]> keys,
			List<byte[]> args) {
		byte[][] argv = BinaryJedis.getParamsWithBinary(keys, args);
		return this.eval(script, keys.size(), argv);
	}

	public Response<Object> eval(byte[] script, int keyCount, byte[]... params) {
		getClient(script).eval(script, keyCount, params);
		return getResponse(BuilderFactory.EVAL_BINARY_RESULT);
	}

	public Response<Object> evalsha(byte[] sha1) {
		return this.evalsha(sha1, 0);
	}

	public Response<Object> evalsha(byte[] sha1, List<byte[]> keys,
			List<byte[]> args) {
		byte[][] argv = BinaryJedis.getParamsWithBinary(keys, args);
		return this.evalsha(sha1, keys.size(), argv);
	}

	public Response<Object> evalsha(byte[] sha1, int keyCount, byte[]... params) {
		getClient(sha1).evalsha(sha1, keyCount, params);
		return getResponse(BuilderFactory.EVAL_BINARY_RESULT);
	}

	@Override
	public Response<Long> pfcount(String... keys) {
		client.pfcount(keys);
		return getResponse(BuilderFactory.LONG);
	}

	@Override
	public Response<Long> pfcount(final byte[]... keys) {
		client.pfcount(keys);
		return getResponse(BuilderFactory.LONG);
	}

	@Override
	public Response<String> pfmerge(byte[] destkey, byte[]... sourcekeys) {
		client.pfmerge(destkey, sourcekeys);
		return getResponse(BuilderFactory.STRING);
	}

	@Override
	public Response<String> pfmerge(String destkey, String... sourcekeys) {
		client.pfmerge(destkey, sourcekeys);
		return getResponse(BuilderFactory.STRING);
	}

}
